package com.sample.service.datastore.ex2;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.logging.Logger;

import org.mortbay.log.Log;

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.PreparedQuery;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Transaction;
import com.google.appengine.api.datastore.Query.FilterOperator;


public class TxSample {

    static DatastoreService store = DatastoreServiceFactory.getDatastoreService();

    static Logger log = Logger.getLogger(TxSample.class.getName());

    public static void create(String userId, String userName) {

        Transaction tx = store.beginTransaction(); // トランザクション開始

        Entity parent = new Entity("Contract");
        parent.setProperty("userId", userId);
        parent.setProperty("userName", userName);
        Key key = store.put(tx, parent); // 親エンティティを永続化。キー取得

        ArrayList<Entity> child = new ArrayList<Entity>();
        Entity childEntity = new Entity("ContractChild", key); // 祖先キーを指定してエンティティ生成

        for (int i = 0; i < 3; i++) {
            Entity entity = childEntity.clone();
            entity.setProperty("plan", "plan" + (i+1));
            child.add(entity);
        }

        store.put(tx, child); // エンティティを永続化

        tx.commit(); // トランザクション終了
    }

    public static void query(String userId) {

        Query query = new Query("Contract"); // 親エンティティに対してのクエリ

        query.addFilter("userId", FilterOperator.EQUAL, userId);
        PreparedQuery prepare = store.prepare(query);
        Entity parent = prepare.asSingleEntity(); // 親エンティティを取得

        if (parent == null) { return; }

        log.info("親エンティティ：" + parent.getProperty("userName"));

        Query childQuery = new Query("ContractChild", parent.getKey()); // 祖先キーを指定したクエリ
        prepare = store.prepare(childQuery);

        Iterator<Entity> childs = prepare.asIterator();

        while ( childs.hasNext()) {
            log.info("プラン：" + childs.next().getProperty("plan"));
        }
    }
}
